/*++

Module Name:

    Device.h

Abstract:

    This module contains the type definitions for the WP7 Accelerometer Sensor
    driver's device callback class.

--*/

#pragma once

class ATL_NO_VTABLE CWP7AccelerometerDevice :
    public CComObjectRootEx<CComMultiThreadModel>,
	public IPnpCallback,
    public IPnpCallbackHardware,
    public IFileCallbackCleanup
{
public:
    ~CWP7AccelerometerDevice();

    DECLARE_NOT_AGGREGATABLE(CWP7AccelerometerDevice)

    BEGIN_COM_MAP(CWP7AccelerometerDevice)
		COM_INTERFACE_ENTRY(IPnpCallback)
        COM_INTERFACE_ENTRY(IPnpCallbackHardware)
        COM_INTERFACE_ENTRY(IFileCallbackCleanup)
    END_COM_MAP()

protected:
    CWP7AccelerometerDevice();

    HRESULT ConfigureQueue();

// COM Interface methods
public:

    //
    // IPnpCallbackHardware
    //
    STDMETHOD_ (HRESULT, OnPrepareHardware)(__in IWDFDevice* pWdfDevice);
    STDMETHOD_ (HRESULT, OnReleaseHardware)(__in IWDFDevice* pWdfDevice);

	//
    // IPnpCallback
    //
    STDMETHOD (OnD0Entry)( __in IWDFDevice* pWdfDevice,  __in WDF_POWER_DEVICE_STATE previousState);
    STDMETHOD (OnD0Exit)( __in IWDFDevice* pWdfDevice,  __in WDF_POWER_DEVICE_STATE newState);
    STDMETHOD_ (VOID, OnSurpriseRemoval)( __in IWDFDevice* pWdfDevice);
    STDMETHOD_ (HRESULT, OnQueryRemove)(  __in IWDFDevice* pWdfDevice);
    STDMETHOD_ (HRESULT, OnQueryStop)( __in IWDFDevice* pWdfDevice);

    //
    // IFileCallbackCleanup
    //
    STDMETHOD_ (VOID, OnCleanupFile)(__in IWDFFile *pWdfFile);

public:

    // The factory method used to create an instance of this device
    static HRESULT CreateInstance(__in IWDFDriver* pDriver, __in IWDFDeviceInitialize*  pDeviceInit);

    HRESULT ProcessIoControl(__in IWDFIoQueue*     pQueue,
                             __in IWDFIoRequest*   pRequest,
                             __in ULONG            ControlCode,
                                  SIZE_T           InputBufferSizeInBytes,
                                  SIZE_T           OutputBufferSizeInBytes,
                                  DWORD*           pcbWritten);
private:

    CComPtr<IWDFDevice>     m_pWdfDevice;
    ISensorClassExtension*  m_pClassExtension;
};

